#include <cstdio>
#include <iostream>
#include <vector>
using namespace std;
#define int long long
struct pos {
	int x, y, z;
};
inline int dis(const pos &a, const pos &b) {
	int X = a.x  - b.x, Y = a.y - b.y, Z = a.z - b.z;
	return X * X + Y * Y + Z * Z;
}
int T, n, h, r;
//int x, y, z;
inline int read()// 定义一个内联函数read，用于读取整数
{
	int x = 0, f = 1; // 初始化x为0，f为1
	char ch = getchar(); // 读取一个字符
	while (ch < '0' || ch > '9') // 如果字符不是数字
	{
		if (ch == '-') // 如果字符是负号
			f = -1; // 将f设为-1
		ch = getchar(); // 继续读取下一个字符
	}
	while (ch >= '0' && ch <= '9') // 如果字符是数字
	{
		x = x * 10 + ch - '0'; // 将字符转换为数字并累加到x上
		ch = getchar(); // 继续读取下一个字符
	}
	return x * f; // 返回结果，如果f为-1，则返回负数
}

class UnionFind {
	public:
		vector<int> parent; // 存储每个元素的父节点
		vector<int> rank; // 存储每个元素的秩（树的高度）
		UnionFind(int num) {    // 构造函数，初始化并查集
			parent.resize(num); // 初始化parent数组，大小为num
			rank.resize(num, 1); // 初始化rank数组，大小为num，初始值为1
			for (int i = 0; i < num; i++) { // 将每个元素的父节点设置为自身
				parent[i] = i;
			}
		}
		int find(int x) {    // 查找元素x的根节点
			if (parent[x] != x) { // 如果x不是根节点
				parent[x] = find(parent[x]); // 递归查找x的根节点，并将x的父节点更新为根节点
			}
			return parent[x]; // 返回x的根节点
		}
		void unite(int x, int y) {  // 合并元素x和元素y所在的集合
			int rootX = find(x); // 查找元素x的根节点
			int rootY = find(y); // 查找元素y的根节点
			if (rank[rootX] < rank[rootY]) { // 如果x的秩小于y的秩
				parent[rootX] = rootY; // 将x的根节点更新为y的根节点
			} else if (rank[rootX] > rank[rootY]) { // 如果x的秩大于y的秩
				parent[rootY] = rootX; // 将y的根节点更新为x的根节点
			} else { // 如果x的秩等于y的秩
				parent[rootY] = rootX; // 将y的根节点更新为x的根节点
				rank[rootX]++; // x的秩加1
			}
		}
};

signed main() {

//	cin >> T;
	T = read();
	while(T --) {
//		cin >> n >> h >> r;
		n = read(),h = read(),r = read();
		UnionFind u(n + 3);
		pos a[n + 1];
		for (int i = 0 ; i < n ; i ++) {
			a[i].x = read(),a[i].y = read(),a[i].z = read();
		}
			for (int i = 0 ; i < n ; i++ ) {
				for (int j = i + 1; j < n ; j ++) {
					if (dis(a[i], a[j]) <= 4 * r * r) {
						//TODO
						u.unite(i, j);
					}
					
				}
				if (a[i].z <= r) {
					u.unite(i, n);
				}
				if (a[i].z + r >= h) {
					//TODO
					u.unite(i, n + 1);
				}
			}
			
			//u.unite(x, y, z);
		
		if (u.find(n) == u.find(n + 1)) {
			//TODO
			puts("Yes");
		} else {
			puts("No");
		}
	
	}
	return 0;
}
